#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <unistd.h>

// 线程创建、终止、线程ID、资源共享

#define ERR_EXIT(m)                           \
    do                                        \
    {                                         \
        std::cout << "m error!" << std::endl; \
        exit(EXIT_FAILURE);                   \
    } while (0);

// 打印线程ID
void showtid(pthread_t &tid)
{
    printf("tid: ox%lx\n", tid);
}

// 获取线程ID
std::string formatId(const pthread_t &tid)
{
    char id[64];
    snprintf(id, sizeof(id), "tid: ox%lx\n", tid);
    return id;
}

// 新线程开始执行的函数
void *start_routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    pthread_t tid = pthread_self();
    int cnt = 5;
    while (cnt)
    {
        std::cout << "我是一个新线程，我的名字是：" << name
                  << "我的线程ID是：" << formatId(tid) << std::endl;
        sleep(1);
        cnt--;
    }
    // return nullptr;
    return (void *)12345; // 暂时：线程退出时的退出码
}

int main()
{
    pthread_t tid;
    // 线程创建
    int n = pthread_create(&tid, nullptr, start_routine, (void *)"thread-1");
    if (n != 0)
        ERR_EXIT("pthread_create");
    // 打印线程ID
    showtid(tid);

    int cnt = 5;
    while (cnt)
    {
        std::cout << "我是一个main线程，我的名字是：" << "main线程，"
                  << "我的线程ID是：" << formatId(pthread_self()) << std::endl;
        sleep(1);
        cnt--;
    }

    // 线程等待
    void *ret = nullptr;
    pthread_join(tid, &ret); // join异常，没有意义！
    std::cout << "ret is " << (long long int)ret << std::endl;

    return 0;
}
